﻿internal class Program
{
    private static void Main(string[] args)
    {
        // 整数类型
        byte byteValue = 255;                    // 0 到 255
        sbyte sbyteValue = -128;                 // -128 到 127
        short shortValue = -32768;               // -32,768 到 32,767
        ushort ushortValue = 65535;              // 0 到 65,535
        int intValue = -2147483648;              // -2,147,483,648 到 2,147,483,647
        uint uintValue = 4294967295;             // 0 到 4,294,967,295
        long longValue = -9223372036854775808;   // -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
        ulong ulongValue = 18446744073709551615; // 0 到 18,446,744,073,709,551,615

        // 浮点类型
        float floatValue = 3.14f;                // 单精度浮点数
        double doubleValue = 3.14159265359;      // 双精度浮点数
        decimal decimalValue = 3.14159265359m;   // 高精度十进制数

        // 布尔类型
        bool boolValue = true;                   // true 或 false

        // 字符类型
        char charValue = 'A';                    // 单个Unicode字符

        // 字符串类型
        string stringValue = "Hello, World!";    // 字符串

        // 对象类型
        object objectValue = new object();       // 所有类型的基类

        // 测试数据类型的方法
        void TestDataTypes()
        {
            Console.WriteLine("=== 整数类型测试 ===");
            Console.WriteLine($"byte: {byteValue},范围:0 到 255");
            Console.WriteLine($"sbyte: {sbyteValue},范围:-128 到 127");
            Console.WriteLine($"short: {shortValue}");
            Console.WriteLine($"ushort: {ushortValue}范围：0 到 65,535");
            Console.WriteLine($"int: {intValue}范围：-2,147,483,648 到 2,147,483,647");
            Console.WriteLine($"uint: {uintValue}范围：0 到 4,294,967,295");
            Console.WriteLine($"long: {longValue}范围：-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807");
            Console.WriteLine($"ulong: {ulongValue}范围：0 到 18,446,744,073,709,551,615");

            Console.WriteLine("\n=== 浮点类型测试 ===");
            Console.WriteLine($"float: {floatValue}范围：-3.402823e38 到 3.402823e38");
            Console.WriteLine($"double: {doubleValue}范围：-1.7976931348623157e308 到 1.7976931348623157e308");
            Console.WriteLine($"decimal: {decimalValue}范围：-7.9228162514264337593543950335 到 7.9228162514264337593543950335");

            Console.WriteLine("\n=== 其他基本类型测试 ===");
            Console.WriteLine($"bool: {boolValue}范围：true 或 false");
            Console.WriteLine($"char: {charValue}范围：单个Unicode字符");
            Console.WriteLine($"string: {stringValue}范围：字符串");
            Console.WriteLine($"object: {objectValue}范围：所有类型的基类");

            // 类型转换示例
            Console.WriteLine("\n=== 类型转换示例 ===");
            int intFromDouble = (int)doubleValue;
            double doubleFromInt = intValue;
            string stringFromInt = intValue.ToString();
            int intFromString = int.Parse("123");

            Console.WriteLine($"int from double: {intFromDouble}");
            Console.WriteLine($"double from int: {doubleFromInt}");
            Console.WriteLine($"string from int: {stringFromInt}");
            Console.WriteLine($"int from string: {intFromString}");
        }

        // 测试值类型和引用类型的方法
        void TestValueAndReferenceTypes()
        {
            Console.WriteLine("=== 值类型测试 ===");

            // 基本值类型
            int number1 = 10;
            int number2 = number1;  // 复制值
            number2 = 20;          // 修改副本不会影响原始值

            Console.WriteLine($"number1: {number1}");  // 输出: 10
            Console.WriteLine($"number2: {number2}");  // 输出: 20

            // 结构体（值类型）
            Point point1 = new Point(10, 20);
            Point point2 = point1;  // 复制整个结构体
            point2.X = 30;         // 修改副本不会影响原始值

            Console.WriteLine($"point1: X={point1.X}, Y={point1.Y}");  // 输出: X=10, Y=20
            Console.WriteLine($"point2: X={point2.X}, Y={point2.Y}");  // 输出: X=30, Y=20

            Console.WriteLine("\n=== 引用类型测试 ===");

            // 类（引用类型）
            Person person1 = new Person("张三", 25);
            Person person2 = person1;  // 复制引用
            person2.Name = "李四";     // 修改会影响原始对象

            Console.WriteLine($"person1: Name={person1.Name}, Age={person1.Age}");  // 输出: Name=李四, Age=25
            Console.WriteLine($"person2: Name={person2.Name}, Age={person2.Age}");  // 输出: Name=李四, Age=25

            // 字符串（特殊的引用类型）
            string str1 = "Hello";
            string str2 = str1;  // 复制引用
            str2 = "World";      // 创建新字符串，不会影响原始字符串

            Console.WriteLine($"str1: {str1}");  // 输出: Hello
            Console.WriteLine($"str2: {str2}");  // 输出: World

            // 数组（引用类型）
            int[] array1 = new int[] { 1, 2, 3 };
            int[] array2 = array1;  // 复制引用
            array2[0] = 10;         // 修改会影响原始数组

            Console.WriteLine("\n数组测试：");
            Console.WriteLine($"array1: [{string.Join(", ", array1)}]");  // 输出: [10, 2, 3]
            Console.WriteLine($"array2: [{string.Join(", ", array2)}]");  // 输出: [10, 2, 3]
        }

        // 调用测试方法
        TestDataTypes();
        TestValueAndReferenceTypes();
    }
}

// 值类型示例
struct Point
{
    public int X;
    public int Y;

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// 引用类型示例
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}